package com.exception;


/**
 *  关键字：
 *      try、catch、finally
 *  快捷键：
 *      （选中指定代码后）Ctrl + Alt + T：选择各种代码块，包裹被选中的代码
 */
public class Test1 {

    /**
     * 测试关键字：try、catch、finally
     * @param args
     */
//    public static void main(String[] args) {
//
//        int a = 1;
//        int b = 0;
//
//        try{
//            /**
//             *  try 监控区域：
//             *      监控如下代码块
//             */
//            System.out.println(a/b);
//            System.out.println(a/b);
//        }catch(ArithmeticException e){
//            /**
//             *  catch 捕获异常：
//             *      参数：想要捕获的异常类型，最高的是 Throwable
//             *      在监控区域，可能出现的一些异常中，捕获ArithmeticException类型的异常，如有，则执行如下代码
//             *      如监控区域代码，有两个相同类型的异常，则只捕获一个
//             */
//            System.out.println("程序出现异常，变量b不能为0！");
//
//        }finally{
//            /**
//             *  finally 善后工作：
//             *      一般是关闭IO等资源的善后工作，下面的代码一定会执行
//             *      （可选）
//             */
//            System.out.println("finally");
//
//        }
//    }


    /**
     * 测试无法捕获，以及finally一定会被执行
     * @param args
     */
//    public static void main(String[] args) {
//
//        /**
//         * catch(ArithmeticException e)  无法捕获  Exception in thread "main" java.lang.StackOverflowError
//         */
////        try{
////            // try
////            new Test().a();
////
////        }catch(ArithmeticException e){
////            // 捕获 ArithmeticException 类型异常
////            System.out.println("程序出现异常，变量b不能为0！");
////
////        }finally{
////            // 必定执行
////            System.out.println("finally");
////
////        }
//
//
//        /**
//         *  将 ArithmeticException 换为 Throwable，捕获成功
//         */
//        try{
//            // try
//            new Test().a();
//
//        }catch(Throwable e){
//            // 捕获 ArithmeticException 类型异常
//            System.out.println("程序出现异常，变量b不能为0！");
//
//        }finally{
//            // 必定执行
//            System.out.println("finally");
//
//        }
//    }
//
//    public void a(){
//        b();
//    }
//
//    public void b(){
//        a();
//    }


    /**
     * 多个 catch
     * @param args
     */
    public static void main(String[] args) {

        int a = 1;
        int b = 0;

        /**
         *  多个 catch：
         *      1. catch 的类型，从上到下，级别要越来越高。否则，把最高的写在第一个，直接就捕获了
         *      2. 本测试，应该输出第 2 个 catch
         */
        try{
            System.out.println(a/b);
        }catch(Error e){
            System.out.println("Error");
        }catch(Exception e){
            System.out.println("Exception");
        }catch(Throwable e){
            System.out.println("Throwable");
        }
        finally{
            System.out.println("finally");
        }
    }





}
